#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h> // 用于 system()
#include <io.h>  // 为了 Windows 兼容性

// 创建目录函数 - 兼容 Windows
void create_directory(const char *path) {
    // 尝试创建目录
    if (mkdir(path) == -1) {
        if (errno != EEXIST) {
            perror("无法创建目录");
            exit(EXIT_FAILURE);
        }
    }
}

// 复制文件函数
void copy_file(const char *source_path, const char *dest_path) {
    FILE *source, *dest;
    char buffer[4096];
    size_t bytes;

    // 打开源文件
    source = fopen(source_path, "rb");
    if (source == NULL) {
        perror("无法打开源文件");
        return;
    }

    // 打开目标文件
    dest = fopen(dest_path, "wb");
    if (dest == NULL) {
        perror("无法创建目标文件");
        fclose(source);
        return;
    }

    // 复制文件内容
    while ((bytes = fread(buffer, 1, sizeof(buffer), source)) > 0) {
        if (fwrite(buffer, 1, bytes, dest) != bytes) {
            perror("写入文件失败");
            break;
        }
    }

    // 关闭文件
    fclose(source);
    fclose(dest);
}

// 递归处理目录的函数
void process_directory(const char *dir_path) {
    DIR *dir;
    struct dirent *entry;
    char path[1024];
    char dest_path[1024];
    struct stat statbuf;

    // 打开目录
    dir = opendir(dir_path);
    if (dir == NULL) {
        perror("无法打开指定目录");
        return;
    }

    // 遍历目录中的所有条目
    while ((entry = readdir(dir)) != NULL) {
        // 跳过当前目录和上级目录
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }

        // 构建完整路径
        snprintf(path, sizeof(path), "%s/%s", dir_path, entry->d_name);

        // 使用 stat 函数获取文件信息
        if (stat(path, &statbuf) == -1) {
            perror("无法获取文件信息");
            continue;
        }

        if (S_ISDIR(statbuf.st_mode)) {
            // 如果是目录
            if (strcmp(entry->d_name, "third_party") != 0) {
                // 不是 third_party 目录，递归处理
                process_directory(path);
            }
        } else {
            // 如果是文件
            char *ext = strrchr(entry->d_name, '.');
            if (ext != NULL && ((strcmp(ext, ".cpp") == 0) || (strcmp(ext, ".h") == 0)|| (strcmp(ext, ".fs") == 0)|| (strcmp(ext, ".vs") == 0))) {
                // 构建目标文件路径（直接放在 testai_txt 目录下）
                snprintf(dest_path, sizeof(dest_path), "./testai_txt/%s.txt", entry->d_name);

                // 复制文件
                copy_file(path, dest_path);
                printf("已复制: %s -> %s\n", path, dest_path);
            }
        }
    }

    // 关闭目录
    if (closedir(dir) != 0) {
        perror("无法关闭目录");
    }
}

int main() {
 // Windows 下设置 UTF-8 编码
#ifdef _WIN32
    system("chcp 65001 > nul"); // > nul 用于隐藏命令输出
#endif
    const char *base_dir = "../frame/My3DFrame1/src";
    process_directory(base_dir);
    copy_file("../frame/My3DFrame1/CMakeLists.txt","./testai_txt/CMakeLists.txt");
    printf("CMakeLists.txt拷贝到指定目录testai_txt下...成功\n");
    while(getchar()!='\n');
    return 0;
}